{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Selecting Solver: ALGAMES, iLQGames\n",
    "This notebook demonstrates how to switch between ALGAMES [1] and iLQGames [2], to solve a dynamic game problem. The one the main difference between the two algorithms is the way constraint are handled. \n",
    "- For iLQGames you have to specify a penalty factor for violating the constraints. Hhigher penalty means \n",
    "    - better constraint satisfaction in general,\n",
    "    - worse numerical conditioning,\n",
    "    - longer solve time,\n",
    "- For ALGAMES, the constraints are handled via an augmented Lagrangian algorithm, no penalty tuning is required. \n",
    "\n",
    "\n",
    "[1] Le Cleac'h, Simon, Mac Schwager, and Zachary Manchester. \"ALGAMES: A Fast Solver for Constrained Dynamic Games.\" arXiv preprint arXiv:1910.09713 (2019).\n",
    "\n",
    "[2] Fridovich-Keil, David, et al. \"Efficient Iterative Linear-Quadratic Approximations for Nonlinear Multi-Player General-Sum Differential Games.\" arXiv preprint arXiv:1909.04694 (2019)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "using ALGAMES\n",
    "using BenchmarkTools\n",
    "using LinearAlgebra\n",
    "using StaticArrays\n",
    "using TrajectoryOptimization\n",
    "const TO = TrajectoryOptimization;"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Define the dynamics model of the game."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "struct InertialUnicycleGame{T} <: AbstractGameModel\n",
    "    n::Int  # Number of states\n",
    "    m::Int  # Number of controls\n",
    "    mp::T\n",
    "    pu::Vector{Vector{Int}} # Indices of the each player's controls\n",
    "    px::Vector{Vector{Int}} # Indices of the each player's x and y positions\n",
    "    p::Int  # Number of players\n",
    "end\n",
    "InertialUnicycleGame() = InertialUnicycleGame(\n",
    "    12,\n",
    "    6,\n",
    "    1.0,\n",
    "    [[1,2],[3,4],[5,6]],\n",
    "    [[1,2],[5,6],[9,10]],\n",
    "    3)\n",
    "Base.size(::InertialUnicycleGame) = 12,6,[[1,2],[3,4],[5,6]],3 # n,m,pu,p"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Instantiate dynamics model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = InertialUnicycleGame()\n",
    "n,m,pu,p = size(model)\n",
    "T = Float64\n",
    "px = model.px\n",
    "\n",
    "# We use the unicycle dynamics for each player. \n",
    "# State   x = [px1, py1, θ1, v1, px2, py2, θ2, v2, px3, py3, θ3, v3] \n",
    "# Control u = [θ1, v1, θ2, v2, θ3, v3]\n",
    "# px1 = x position of player 1 \n",
    "# py1 = y position of player 1 \n",
    "# θ1 = orientation of player 1 \n",
    "# v1 = x velocity of player 1 \n",
    "\n",
    "function TO.dynamics(model::InertialUnicycleGame, x, u) # Non memory allocating dynamics\n",
    "    qd1 = @SVector [cos(x[3]), sin(x[3])]\n",
    "    qd1 *= x[4]\n",
    "    qd2 = @SVector [cos(x[7]), sin(x[7])]\n",
    "    qd2 *= x[8]\n",
    "    qd3 = @SVector [cos(x[11]), sin(x[11])]\n",
    "    qd3 *= x[12]\n",
    "    qdd1 = u[ @SVector [1,2] ]\n",
    "    qdd2 = u[ @SVector [3,4] ]\n",
    "    qdd3 = u[ @SVector [5,6] ]\n",
    "    return [qd1; qdd1; qd2; qdd2; qd3; qdd3]\n",
    "end;"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Discretization of the trajectories"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "tf = 3.0  # final time\n",
    "N = 41    # number of knot points\n",
    "dt = tf / (N-1); # time step duration"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Initial and final state definition"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Define initial and final states (be sure to use Static Vectors!)\n",
    "x0 = @SVector  [\n",
    "               -0.80, -0.05,  0.00, 0.60, #player 1 x,y,θ,v\n",
    "               -1.00, -0.05,  0.00, 0.60, #player 2 x,y,θ,v\n",
    "               -0.90, -0.30, pi/12, 0.63, #player 3 x,y,θ,v\n",
    "                ]\n",
    "xf = @SVector [\n",
    "                1.10, -0.05,  0.00, 0.60, #player 1 x,y,θ,v\n",
    "                0.70, -0.05,  0.00, 0.60, #player 2 x,y,θ,v\n",
    "                0.90, -0.05,  0.00, 0.60, #player 3 x,y,θ,v\n",
    "               ];"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Define players objective functions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Define quadratic costs\n",
    "diag_Q1 = @SVector [ # Player 1 state cost\n",
    "    0., 10., 1., 1.,\n",
    "    0., 0., 0., 0.,\n",
    "    0., 0., 0., 0.]\n",
    "diag_Q2 = @SVector [ # Player 2 state cost\n",
    "    0., 0., 0., 0.,\n",
    "    0., 10., 1., 1.,\n",
    "    0., 0., 0., 0.]\n",
    "diag_Q3 = @SVector [ # Player 3 state cost\n",
    "    0., 0., 0., 0.,\n",
    "    0., 0., 0., 0.,\n",
    "    0., 10., 1., 1.]\n",
    "\n",
    "# Players stage state costs\n",
    "Q = [0.1*Diagonal(diag_Q1), \n",
    "     0.1*Diagonal(diag_Q2),\n",
    "     0.1*Diagonal(diag_Q3)]\n",
    "\n",
    "# Players final state costs\n",
    "Qf = [1.0*Diagonal(diag_Q1),\n",
    "      1.0*Diagonal(diag_Q2),\n",
    "      1.0*Diagonal(diag_Q3)]\n",
    "\n",
    "# Players controls costs\n",
    "R = [0.1*Diagonal(@SVector ones(length(pu[1]))),\n",
    "     0.1*Diagonal(@SVector ones(length(pu[2]))),\n",
    "     0.1*Diagonal(@SVector ones(length(pu[3]))),\n",
    "    ]\n",
    "\n",
    "# Players objectives\n",
    "obj = [LQRObjective(Q[i],R[i],Qf[i],xf,N) for i=1:p];"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Define the initial trajectory"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "xs = SVector{n}(zeros(n))\n",
    "us = SVector{m}(zeros(m))\n",
    "Z = [KnotPoint(xs,us,dt) for k = 1:N]\n",
    "Z[end] = KnotPoint(xs,m);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Build the ramp merging scenario"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Actors \n",
    "car_radius = 0.08\n",
    "car_radii = [car_radius for i=1:p]\n",
    "actors_types = [:car, :car, :car]\n",
    "\n",
    "#Scene\n",
    "road_length = 6.0\n",
    "road_width = 0.30\n",
    "ramp_length = 3.2\n",
    "ramp_angle = pi/12\n",
    "\n",
    "# Build scenario\n",
    "scenario = MergingScenario(\n",
    "        road_length, road_width, ramp_length, \n",
    "        ramp_angle, car_radii, actors_types);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Define a constraint set per solver"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create constraint sets\n",
    "algames_conSet = ConstraintSet(n,m,N)\n",
    "ilqgames_conSet = ConstraintSet(n,m,N)\n",
    "con_inds = 2:N # Indices where the constraints will be applied\n",
    "\n",
    "# Add collision avoidance constraints\n",
    "add_collision_avoidance(algames_conSet, car_radii, px, p, con_inds)\n",
    "add_collision_avoidance(ilqgames_conSet, car_radii, px, p, con_inds)\n",
    "\n",
    "# Add scenario specific constraints (road boundaries)\n",
    "add_scenario_constraints(algames_conSet, scenario, px, con_inds; constraint_type=:constraint)\n",
    "add_scenario_constraints(ilqgames_conSet, scenario, px, con_inds; constraint_type=:constraint);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Define one problem per solver"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "algames_prob = GameProblem(model, obj, algames_conSet, x0, xf, Z, N, tf);\n",
    "ilqgames_prob = GameProblem(model, obj, ilqgames_conSet, x0, xf, Z, N, tf);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Build the ALGAMES solver "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# AlGAMES\n",
    "algames_opts = DirectGamesSolverOptions{T}(\n",
    "    iterations=10,\n",
    "    inner_iterations=20,\n",
    "    iterations_linesearch=10)\n",
    "algames_solver = DirectGamesSolver(algames_prob, algames_opts);\n",
    "\n",
    "# iLQGames\n",
    "ilqgames_opts = PenaltyiLQGamesSolverOptions{T}(\n",
    "    iterations=200,\n",
    "    iterations_linesearch=10)\n",
    "ilqgames_solver = PenaltyiLQGamesSolver(ilqgames_prob, ilqgames_opts)\n",
    "\n",
    "# Tune this penalty parameter to get better constraint satisfaction for iLQGames\n",
    "pen = 100.0 * ones(length(ilqgames_solver.constraints)) \n",
    "set_penalty!(ilqgames_solver, pen);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Solve the problem"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  0.037675 seconds (13.62 k allocations: 11.961 MiB)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "┌ Info: (\"Solver iteration = \", 1)\n",
      "└ @ ALGAMES /home/kantorovich/.julia/packages/ALGAMES/gNlVw/src/solvers/direct/direct_methods.jl:39\n",
      "┌ Info: (\"Solver iteration = \", 2)\n",
      "└ @ ALGAMES /home/kantorovich/.julia/packages/ALGAMES/gNlVw/src/solvers/direct/direct_methods.jl:39\n",
      "┌ Info: (\"Solver iteration = \", 3)\n",
      "└ @ ALGAMES /home/kantorovich/.julia/packages/ALGAMES/gNlVw/src/solvers/direct/direct_methods.jl:39\n",
      "┌ Info: (\"Solver iteration = \", 4)\n",
      "└ @ ALGAMES /home/kantorovich/.julia/packages/ALGAMES/gNlVw/src/solvers/direct/direct_methods.jl:39\n",
      "┌ Info: Outer loop converged: cost_tolerance & constraint_tolerance\n",
      "└ @ ALGAMES /home/kantorovich/.julia/packages/ALGAMES/gNlVw/src/solvers/direct/direct_methods.jl:146\n"
     ]
    }
   ],
   "source": [
    "@time solve!(algames_solver);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "┌ Info: (\"Solver iteration = \", 1)\n",
      "└ @ ALGAMES /home/kantorovich/.julia/packages/ALGAMES/gNlVw/src/solvers/riccati/penalty_ilqgames/penalty_ilqgames_methods.jl:50\n",
      "┌ Info: (\"Solver iteration = \", 2)\n",
      "└ @ ALGAMES /home/kantorovich/.julia/packages/ALGAMES/gNlVw/src/solvers/riccati/penalty_ilqgames/penalty_ilqgames_methods.jl:50\n",
      "┌ Info: (\"Solver iteration = \", 3)\n",
      "└ @ ALGAMES /home/kantorovich/.julia/packages/ALGAMES/gNlVw/src/solvers/riccati/penalty_ilqgames/penalty_ilqgames_methods.jl:50\n",
      "┌ Info: (\"Solver iteration = \", 4)\n",
      "└ @ ALGAMES /home/kantorovich/.julia/packages/ALGAMES/gNlVw/src/solvers/riccati/penalty_ilqgames/penalty_ilqgames_methods.jl:50\n",
      "┌ Info: (\"Solver iteration = \", 5)\n",
      "└ @ ALGAMES /home/kantorovich/.julia/packages/ALGAMES/gNlVw/src/solvers/riccati/penalty_ilqgames/penalty_ilqgames_methods.jl:50\n",
      "┌ Info: (\"Solver iteration = \", 6)\n",
      "└ @ ALGAMES /home/kantorovich/.julia/packages/ALGAMES/gNlVw/src/solvers/riccati/penalty_ilqgames/penalty_ilqgames_methods.jl:50\n",
      "┌ Info: (\"Solver iteration = \", 7)\n",
      "└ @ ALGAMES /home/kantorovich/.julia/packages/ALGAMES/gNlVw/src/solvers/riccati/penalty_ilqgames/penalty_ilqgames_methods.jl:50\n",
      "┌ Info: (\"Solver iteration = \", 8)\n",
      "└ @ ALGAMES /home/kantorovich/.julia/packages/ALGAMES/gNlVw/src/solvers/riccati/penalty_ilqgames/penalty_ilqgames_methods.jl:50\n",
      "┌ Info: (\"Solver iteration = \", 9)\n",
      "└ @ ALGAMES /home/kantorovich/.julia/packages/ALGAMES/gNlVw/src/solvers/riccati/penalty_ilqgames/penalty_ilqgames_methods.jl:50\n",
      "┌ Info: (\"Solver iteration = \", 10)\n",
      "└ @ ALGAMES /home/kantorovich/.julia/packages/ALGAMES/gNlVw/src/solvers/riccati/penalty_ilqgames/penalty_ilqgames_methods.jl:50\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  0.233107 seconds (693.65 k allocations: 208.817 MiB, 43.73% gc time)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "┌ Info: (\"Solver iteration = \", 11)\n",
      "└ @ ALGAMES /home/kantorovich/.julia/packages/ALGAMES/gNlVw/src/solvers/riccati/penalty_ilqgames/penalty_ilqgames_methods.jl:50\n",
      "┌ Info: (\"Solver iteration = \", 12)\n",
      "└ @ ALGAMES /home/kantorovich/.julia/packages/ALGAMES/gNlVw/src/solvers/riccati/penalty_ilqgames/penalty_ilqgames_methods.jl:50\n",
      "┌ Info: (\"Solver iteration = \", 13)\n",
      "└ @ ALGAMES /home/kantorovich/.julia/packages/ALGAMES/gNlVw/src/solvers/riccati/penalty_ilqgames/penalty_ilqgames_methods.jl:50\n",
      "┌ Info: (\"Solver iteration = \", 14)\n",
      "└ @ ALGAMES /home/kantorovich/.julia/packages/ALGAMES/gNlVw/src/solvers/riccati/penalty_ilqgames/penalty_ilqgames_methods.jl:50\n",
      "┌ Info: (\"Solver iteration = \", 15)\n",
      "└ @ ALGAMES /home/kantorovich/.julia/packages/ALGAMES/gNlVw/src/solvers/riccati/penalty_ilqgames/penalty_ilqgames_methods.jl:50\n",
      "┌ Info: (\"Solver iteration = \", 16)\n",
      "└ @ ALGAMES /home/kantorovich/.julia/packages/ALGAMES/gNlVw/src/solvers/riccati/penalty_ilqgames/penalty_ilqgames_methods.jl:50\n",
      "┌ Info: gradient tolerance < gradient_norm_tolerance\n",
      "└ @ ALGAMES /home/kantorovich/.julia/packages/ALGAMES/gNlVw/src/solvers/riccati/penalty_ilqgames/penalty_ilqgames_methods.jl:200\n"
     ]
    }
   ],
   "source": [
    "@time solve!(ilqgames_solver);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Evaluate the solve time"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  33.438 ms (15403 allocations: 11.77 MiB)\n"
     ]
    }
   ],
   "source": [
    "reset!(algames_solver, reset_type=:full)\n",
    "algames_solver.opts.log_level = TO.Logging.Warn\n",
    "@btime timing_solve(algames_solver);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  112.475 ms (695388 allocations: 209.04 MiB)\n"
     ]
    }
   ],
   "source": [
    "reset!(ilqgames_solver, reset_type=:full)\n",
    "ilqgames_solver.opts.log_level = TO.Logging.Warn\n",
    "@btime timing_solve(ilqgames_solver);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Visualize solver iterations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n",
       "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"600\" height=\"400\" viewBox=\"0 0 2400 1600\">\n",
       "<defs>\n",
       "  <clipPath id=\"clip4900\">\n",
       "    <rect x=\"0\" y=\"0\" width=\"2400\" height=\"1600\"/>\n",
       "  </clipPath>\n",
       "</defs>\n",
       "<path clip-path=\"url(#clip4900)\" d=\"\n",
       "M0 1600 L2400 1600 L2400 0 L0 0  Z\n",
       "  \" fill=\"#ffffff\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
       "<defs>\n",
       "  <clipPath id=\"clip4901\">\n",
       "    <rect x=\"480\" y=\"0\" width=\"1681\" height=\"1600\"/>\n",
       "  </clipPath>\n",
       "</defs>\n",
       "<path clip-path=\"url(#clip4900)\" d=\"\n",
       "M243.864 1425.62 L2352.76 1425.62 L2352.76 121.675 L243.864 121.675  Z\n",
       "  \" fill=\"#ffffff\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
       "<defs>\n",
       "  <clipPath id=\"clip4902\">\n",
       "    <rect x=\"243\" y=\"121\" width=\"2110\" height=\"1305\"/>\n",
       "  </clipPath>\n",
       "</defs>\n",
       "<polyline clip-path=\"url(#clip4902)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  303.55,1425.62 303.55,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4902)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  800.93,1425.62 800.93,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4902)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  1298.31,1425.62 1298.31,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4902)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  1795.69,1425.62 1795.69,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4902)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  2293.07,1425.62 2293.07,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4902)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  243.864,1304.32 2352.76,1304.32 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4902)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  243.864,1145.32 2352.76,1145.32 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4902)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  243.864,986.309 2352.76,986.309 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4902)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  243.864,827.304 2352.76,827.304 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4902)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  243.864,668.298 2352.76,668.298 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4902)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  243.864,509.293 2352.76,509.293 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4902)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  243.864,350.287 2352.76,350.287 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4902)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  243.864,191.281 2352.76,191.281 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,1425.62 2352.76,1425.62 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,1425.62 243.864,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  303.55,1425.62 303.55,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  800.93,1425.62 800.93,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  1298.31,1425.62 1298.31,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  1795.69,1425.62 1795.69,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  2293.07,1425.62 2293.07,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,1304.32 269.171,1304.32 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,1145.32 269.171,1145.32 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,986.309 269.171,986.309 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,827.304 269.171,827.304 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,668.298 269.171,668.298 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,509.293 269.171,509.293 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,350.287 269.171,350.287 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,191.281 269.171,191.281 \n",
       "  \"/>\n",
       "<g clip-path=\"url(#clip4900)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 303.55, 1479.62)\" x=\"303.55\" y=\"1479.62\">0</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip4900)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 800.93, 1479.62)\" x=\"800.93\" y=\"1479.62\">2</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip4900)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 1298.31, 1479.62)\" x=\"1298.31\" y=\"1479.62\">4</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip4900)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 1795.69, 1479.62)\" x=\"1795.69\" y=\"1479.62\">6</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip4900)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 2293.07, 1479.62)\" x=\"2293.07\" y=\"1479.62\">8</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip4900)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 219.864, 1321.82)\" x=\"219.864\" y=\"1321.82\">-3.2</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip4900)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 219.864, 1162.82)\" x=\"219.864\" y=\"1162.82\">-3.0</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip4900)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 219.864, 1003.81)\" x=\"219.864\" y=\"1003.81\">-2.8</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip4900)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 219.864, 844.804)\" x=\"219.864\" y=\"844.804\">-2.6</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip4900)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 219.864, 685.798)\" x=\"219.864\" y=\"685.798\">-2.4</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip4900)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 219.864, 526.793)\" x=\"219.864\" y=\"526.793\">-2.2</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip4900)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 219.864, 367.787)\" x=\"219.864\" y=\"367.787\">-2.0</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip4900)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 219.864, 208.781)\" x=\"219.864\" y=\"208.781\">-1.8</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip4900)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:84px; text-anchor:middle;\" transform=\"rotate(0, 1298.31, 73.2)\" x=\"1298.31\" y=\"73.2\">Optimality Constraint Satisfaction</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip4900)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:66px; text-anchor:middle;\" transform=\"rotate(0, 1298.31, 1559.48)\" x=\"1298.31\" y=\"1559.48\">Solver Iterations</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip4900)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:66px; text-anchor:middle;\" transform=\"rotate(-90, 89.2861, 773.647)\" x=\"89.2861\" y=\"773.647\">log(||G||_2)</text>\n",
       "</g>\n",
       "<path clip-path=\"url(#clip4902)\" d=\"\n",
       "M303.55 1388.71 L800.93 1388.71 L800.93 158.579 L303.55 158.579 L303.55 1388.71  Z\n",
       "  \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"0.3\"/>\n",
       "<polyline clip-path=\"url(#clip4902)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:0.3; fill:none\" points=\"\n",
       "  303.55,1388.71 800.93,1388.71 800.93,158.579 303.55,158.579 303.55,1388.71 \n",
       "  \"/>\n",
       "<path clip-path=\"url(#clip4902)\" d=\"\n",
       "M800.93 1388.71 L1298.31 1388.71 L1298.31 158.579 L800.93 158.579 L800.93 1388.71  Z\n",
       "  \" fill=\"#e26f46\" fill-rule=\"evenodd\" fill-opacity=\"0.3\"/>\n",
       "<polyline clip-path=\"url(#clip4902)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:0.3; fill:none\" points=\"\n",
       "  800.93,1388.71 1298.31,1388.71 1298.31,158.579 800.93,158.579 800.93,1388.71 \n",
       "  \"/>\n",
       "<path clip-path=\"url(#clip4902)\" d=\"\n",
       "M1298.31 1388.71 L1795.69 1388.71 L1795.69 158.579 L1298.31 158.579 L1298.31 1388.71  Z\n",
       "  \" fill=\"#3da44d\" fill-rule=\"evenodd\" fill-opacity=\"0.3\"/>\n",
       "<polyline clip-path=\"url(#clip4902)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:0.3; fill:none\" points=\"\n",
       "  1298.31,1388.71 1795.69,1388.71 1795.69,158.579 1298.31,158.579 1298.31,1388.71 \n",
       "  \"/>\n",
       "<path clip-path=\"url(#clip4902)\" d=\"\n",
       "M1795.69 1388.71 L2293.07 1388.71 L2293.07 158.579 L1795.69 158.579 L1795.69 1388.71  Z\n",
       "  \" fill=\"#c271d2\" fill-rule=\"evenodd\" fill-opacity=\"0.3\"/>\n",
       "<polyline clip-path=\"url(#clip4902)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:0.3; fill:none\" points=\"\n",
       "  1795.69,1388.71 2293.07,1388.71 2293.07,158.579 1795.69,158.579 1795.69,1388.71 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip4902)\" style=\"stroke:#ac8d18; stroke-width:4; stroke-opacity:1; fill:none\" stroke-dasharray=\"2, 4\" points=\"\n",
       "  552.24,1388.71 800.93,1118.28 1049.62,1028.67 1298.31,1119.49 1547,953.607 1795.69,1119.11 2044.38,1134.36 2293.07,1233.18 \n",
       "  \"/>\n",
       "<circle clip-path=\"url(#clip4902)\" cx=\"552.24\" cy=\"1388.71\" r=\"14\" fill=\"#ac8d18\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip4902)\" cx=\"800.93\" cy=\"1118.28\" r=\"14\" fill=\"#ac8d18\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip4902)\" cx=\"1049.62\" cy=\"1028.67\" r=\"14\" fill=\"#ac8d18\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip4902)\" cx=\"1298.31\" cy=\"1119.49\" r=\"14\" fill=\"#ac8d18\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip4902)\" cx=\"1547\" cy=\"953.607\" r=\"14\" fill=\"#ac8d18\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip4902)\" cx=\"1795.69\" cy=\"1119.11\" r=\"14\" fill=\"#ac8d18\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip4902)\" cx=\"2044.38\" cy=\"1134.36\" r=\"14\" fill=\"#ac8d18\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip4902)\" cx=\"2293.07\" cy=\"1233.18\" r=\"14\" fill=\"#ac8d18\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<path clip-path=\"url(#clip4900)\" d=\"\n",
       "M1759.8 568.075 L2280.76 568.075 L2280.76 205.195 L1759.8 205.195  Z\n",
       "  \" fill=\"#ffffff\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
       "<polyline clip-path=\"url(#clip4900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  1759.8,568.075 2280.76,568.075 2280.76,205.195 1759.8,205.195 1759.8,568.075 \n",
       "  \"/>\n",
       "<path clip-path=\"url(#clip4900)\" d=\"\n",
       "M1783.8 289.867 L1927.8 289.867 L1927.8 241.483 L1783.8 241.483 L1783.8 289.867  Z\n",
       "  \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"0.3\"/>\n",
       "<polyline clip-path=\"url(#clip4900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  1783.8,289.867 1927.8,289.867 1927.8,241.483 1783.8,241.483 1783.8,289.867 \n",
       "  \"/>\n",
       "<g clip-path=\"url(#clip4900)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:start;\" transform=\"rotate(0, 1951.8, 283.175)\" x=\"1951.8\" y=\"283.175\">Outer Loop 1</text>\n",
       "</g>\n",
       "<path clip-path=\"url(#clip4900)\" d=\"\n",
       "M1783.8 350.347 L1927.8 350.347 L1927.8 301.963 L1783.8 301.963 L1783.8 350.347  Z\n",
       "  \" fill=\"#e26f46\" fill-rule=\"evenodd\" fill-opacity=\"0.3\"/>\n",
       "<polyline clip-path=\"url(#clip4900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  1783.8,350.347 1927.8,350.347 1927.8,301.963 1783.8,301.963 1783.8,350.347 \n",
       "  \"/>\n",
       "<g clip-path=\"url(#clip4900)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:start;\" transform=\"rotate(0, 1951.8, 343.655)\" x=\"1951.8\" y=\"343.655\">Outer Loop 2</text>\n",
       "</g>\n",
       "<path clip-path=\"url(#clip4900)\" d=\"\n",
       "M1783.8 410.827 L1927.8 410.827 L1927.8 362.443 L1783.8 362.443 L1783.8 410.827  Z\n",
       "  \" fill=\"#3da44d\" fill-rule=\"evenodd\" fill-opacity=\"0.3\"/>\n",
       "<polyline clip-path=\"url(#clip4900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  1783.8,410.827 1927.8,410.827 1927.8,362.443 1783.8,362.443 1783.8,410.827 \n",
       "  \"/>\n",
       "<g clip-path=\"url(#clip4900)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:start;\" transform=\"rotate(0, 1951.8, 404.135)\" x=\"1951.8\" y=\"404.135\">Outer Loop 3</text>\n",
       "</g>\n",
       "<path clip-path=\"url(#clip4900)\" d=\"\n",
       "M1783.8 471.307 L1927.8 471.307 L1927.8 422.923 L1783.8 422.923 L1783.8 471.307  Z\n",
       "  \" fill=\"#c271d2\" fill-rule=\"evenodd\" fill-opacity=\"0.3\"/>\n",
       "<polyline clip-path=\"url(#clip4900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  1783.8,471.307 1927.8,471.307 1927.8,422.923 1783.8,422.923 1783.8,471.307 \n",
       "  \"/>\n",
       "<g clip-path=\"url(#clip4900)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:start;\" transform=\"rotate(0, 1951.8, 464.615)\" x=\"1951.8\" y=\"464.615\">Outer Loop 4</text>\n",
       "</g>\n",
       "<polyline clip-path=\"url(#clip4900)\" style=\"stroke:#ac8d18; stroke-width:4; stroke-opacity:1; fill:none\" stroke-dasharray=\"2, 4\" points=\"\n",
       "  1783.8,507.595 1927.8,507.595 \n",
       "  \"/>\n",
       "<circle clip-path=\"url(#clip4900)\" cx=\"1867.8\" cy=\"507.595\" r=\"21\" fill=\"#ac8d18\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<g clip-path=\"url(#clip4900)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:start;\" transform=\"rotate(0, 1951.8, 525.095)\" x=\"1951.8\" y=\"525.095\">log(||G||_2)</text>\n",
       "</g>\n",
       "</svg>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n",
       "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"600\" height=\"400\" viewBox=\"0 0 2400 1600\">\n",
       "<defs>\n",
       "  <clipPath id=\"clip5300\">\n",
       "    <rect x=\"0\" y=\"0\" width=\"2400\" height=\"1600\"/>\n",
       "  </clipPath>\n",
       "</defs>\n",
       "<path clip-path=\"url(#clip5300)\" d=\"\n",
       "M0 1600 L2400 1600 L2400 0 L0 0  Z\n",
       "  \" fill=\"#ffffff\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
       "<defs>\n",
       "  <clipPath id=\"clip5301\">\n",
       "    <rect x=\"480\" y=\"0\" width=\"1681\" height=\"1600\"/>\n",
       "  </clipPath>\n",
       "</defs>\n",
       "<path clip-path=\"url(#clip5300)\" d=\"\n",
       "M243.864 1425.62 L2352.76 1425.62 L2352.76 121.675 L243.864 121.675  Z\n",
       "  \" fill=\"#ffffff\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
       "<defs>\n",
       "  <clipPath id=\"clip5302\">\n",
       "    <rect x=\"243\" y=\"121\" width=\"2110\" height=\"1305\"/>\n",
       "  </clipPath>\n",
       "</defs>\n",
       "<polyline clip-path=\"url(#clip5302)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  303.55,1425.62 303.55,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5302)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  800.93,1425.62 800.93,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5302)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  1298.31,1425.62 1298.31,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5302)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  1795.69,1425.62 1795.69,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5302)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  2293.07,1425.62 2293.07,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5302)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  243.864,1388.71 2352.76,1388.71 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5302)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  243.864,1081.18 2352.76,1081.18 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5302)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  243.864,773.647 2352.76,773.647 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5302)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  243.864,466.113 2352.76,466.113 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5302)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  243.864,158.579 2352.76,158.579 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5300)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,1425.62 2352.76,1425.62 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5300)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,1425.62 243.864,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5300)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  303.55,1425.62 303.55,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5300)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  800.93,1425.62 800.93,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5300)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  1298.31,1425.62 1298.31,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5300)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  1795.69,1425.62 1795.69,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5300)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  2293.07,1425.62 2293.07,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5300)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,1388.71 269.171,1388.71 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5300)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,1081.18 269.171,1081.18 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5300)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,773.647 269.171,773.647 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5300)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,466.113 269.171,466.113 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5300)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,158.579 269.171,158.579 \n",
       "  \"/>\n",
       "<g clip-path=\"url(#clip5300)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 303.55, 1479.62)\" x=\"303.55\" y=\"1479.62\">0</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5300)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 800.93, 1479.62)\" x=\"800.93\" y=\"1479.62\">2</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5300)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 1298.31, 1479.62)\" x=\"1298.31\" y=\"1479.62\">4</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5300)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 1795.69, 1479.62)\" x=\"1795.69\" y=\"1479.62\">6</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5300)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 2293.07, 1479.62)\" x=\"2293.07\" y=\"1479.62\">8</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5300)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 219.864, 1406.21)\" x=\"219.864\" y=\"1406.21\">-1.0</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5300)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 219.864, 1098.68)\" x=\"219.864\" y=\"1098.68\">-0.5</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5300)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 219.864, 791.147)\" x=\"219.864\" y=\"791.147\">0.0</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5300)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 219.864, 483.613)\" x=\"219.864\" y=\"483.613\">0.5</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5300)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 219.864, 176.079)\" x=\"219.864\" y=\"176.079\">1.0</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5300)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:84px; text-anchor:middle;\" transform=\"rotate(0, 1298.31, 73.2)\" x=\"1298.31\" y=\"73.2\">Log_2 Newton Step Size</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5300)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:66px; text-anchor:middle;\" transform=\"rotate(0, 1298.31, 1559.48)\" x=\"1298.31\" y=\"1559.48\">Solver Iterations</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5300)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:66px; text-anchor:middle;\" transform=\"rotate(-90, 89.2861, 773.647)\" x=\"89.2861\" y=\"773.647\">log_2(alpha)</text>\n",
       "</g>\n",
       "<path clip-path=\"url(#clip5302)\" d=\"\n",
       "M303.55 1388.71 L800.93 1388.71 L800.93 158.579 L303.55 158.579 L303.55 1388.71  Z\n",
       "  \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"0.3\"/>\n",
       "<polyline clip-path=\"url(#clip5302)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:0.3; fill:none\" points=\"\n",
       "  303.55,1388.71 800.93,1388.71 800.93,158.579 303.55,158.579 303.55,1388.71 \n",
       "  \"/>\n",
       "<path clip-path=\"url(#clip5302)\" d=\"\n",
       "M800.93 1388.71 L1298.31 1388.71 L1298.31 158.579 L800.93 158.579 L800.93 1388.71  Z\n",
       "  \" fill=\"#e26f46\" fill-rule=\"evenodd\" fill-opacity=\"0.3\"/>\n",
       "<polyline clip-path=\"url(#clip5302)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:0.3; fill:none\" points=\"\n",
       "  800.93,1388.71 1298.31,1388.71 1298.31,158.579 800.93,158.579 800.93,1388.71 \n",
       "  \"/>\n",
       "<path clip-path=\"url(#clip5302)\" d=\"\n",
       "M1298.31 1388.71 L1795.69 1388.71 L1795.69 158.579 L1298.31 158.579 L1298.31 1388.71  Z\n",
       "  \" fill=\"#3da44d\" fill-rule=\"evenodd\" fill-opacity=\"0.3\"/>\n",
       "<polyline clip-path=\"url(#clip5302)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:0.3; fill:none\" points=\"\n",
       "  1298.31,1388.71 1795.69,1388.71 1795.69,158.579 1298.31,158.579 1298.31,1388.71 \n",
       "  \"/>\n",
       "<path clip-path=\"url(#clip5302)\" d=\"\n",
       "M1795.69 1388.71 L2293.07 1388.71 L2293.07 158.579 L1795.69 158.579 L1795.69 1388.71  Z\n",
       "  \" fill=\"#c271d2\" fill-rule=\"evenodd\" fill-opacity=\"0.3\"/>\n",
       "<polyline clip-path=\"url(#clip5302)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:0.3; fill:none\" points=\"\n",
       "  1795.69,1388.71 2293.07,1388.71 2293.07,158.579 1795.69,158.579 1795.69,1388.71 \n",
       "  \"/>\n",
       "<circle clip-path=\"url(#clip5302)\" cx=\"552.24\" cy=\"773.647\" r=\"14\" fill=\"#ac8d18\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip5302)\" cx=\"1049.62\" cy=\"1388.71\" r=\"14\" fill=\"#ac8d18\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip5302)\" cx=\"1547\" cy=\"773.647\" r=\"14\" fill=\"#ac8d18\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip5302)\" cx=\"2044.38\" cy=\"773.647\" r=\"14\" fill=\"#ac8d18\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<path clip-path=\"url(#clip5300)\" d=\"\n",
       "M1759.8 568.075 L2280.76 568.075 L2280.76 205.195 L1759.8 205.195  Z\n",
       "  \" fill=\"#ffffff\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
       "<polyline clip-path=\"url(#clip5300)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  1759.8,568.075 2280.76,568.075 2280.76,205.195 1759.8,205.195 1759.8,568.075 \n",
       "  \"/>\n",
       "<path clip-path=\"url(#clip5300)\" d=\"\n",
       "M1783.8 289.867 L1927.8 289.867 L1927.8 241.483 L1783.8 241.483 L1783.8 289.867  Z\n",
       "  \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"0.3\"/>\n",
       "<polyline clip-path=\"url(#clip5300)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  1783.8,289.867 1927.8,289.867 1927.8,241.483 1783.8,241.483 1783.8,289.867 \n",
       "  \"/>\n",
       "<g clip-path=\"url(#clip5300)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:start;\" transform=\"rotate(0, 1951.8, 283.175)\" x=\"1951.8\" y=\"283.175\">Outer Loop 1</text>\n",
       "</g>\n",
       "<path clip-path=\"url(#clip5300)\" d=\"\n",
       "M1783.8 350.347 L1927.8 350.347 L1927.8 301.963 L1783.8 301.963 L1783.8 350.347  Z\n",
       "  \" fill=\"#e26f46\" fill-rule=\"evenodd\" fill-opacity=\"0.3\"/>\n",
       "<polyline clip-path=\"url(#clip5300)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  1783.8,350.347 1927.8,350.347 1927.8,301.963 1783.8,301.963 1783.8,350.347 \n",
       "  \"/>\n",
       "<g clip-path=\"url(#clip5300)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:start;\" transform=\"rotate(0, 1951.8, 343.655)\" x=\"1951.8\" y=\"343.655\">Outer Loop 2</text>\n",
       "</g>\n",
       "<path clip-path=\"url(#clip5300)\" d=\"\n",
       "M1783.8 410.827 L1927.8 410.827 L1927.8 362.443 L1783.8 362.443 L1783.8 410.827  Z\n",
       "  \" fill=\"#3da44d\" fill-rule=\"evenodd\" fill-opacity=\"0.3\"/>\n",
       "<polyline clip-path=\"url(#clip5300)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  1783.8,410.827 1927.8,410.827 1927.8,362.443 1783.8,362.443 1783.8,410.827 \n",
       "  \"/>\n",
       "<g clip-path=\"url(#clip5300)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:start;\" transform=\"rotate(0, 1951.8, 404.135)\" x=\"1951.8\" y=\"404.135\">Outer Loop 3</text>\n",
       "</g>\n",
       "<path clip-path=\"url(#clip5300)\" d=\"\n",
       "M1783.8 471.307 L1927.8 471.307 L1927.8 422.923 L1783.8 422.923 L1783.8 471.307  Z\n",
       "  \" fill=\"#c271d2\" fill-rule=\"evenodd\" fill-opacity=\"0.3\"/>\n",
       "<polyline clip-path=\"url(#clip5300)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  1783.8,471.307 1927.8,471.307 1927.8,422.923 1783.8,422.923 1783.8,471.307 \n",
       "  \"/>\n",
       "<g clip-path=\"url(#clip5300)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:start;\" transform=\"rotate(0, 1951.8, 464.615)\" x=\"1951.8\" y=\"464.615\">Outer Loop 4</text>\n",
       "</g>\n",
       "<polyline clip-path=\"url(#clip5300)\" style=\"stroke:#ac8d18; stroke-width:4; stroke-opacity:1; fill:none\" stroke-dasharray=\"2, 4\" points=\"\n",
       "  1783.8,507.595 1927.8,507.595 \n",
       "  \"/>\n",
       "<circle clip-path=\"url(#clip5300)\" cx=\"1867.8\" cy=\"507.595\" r=\"21\" fill=\"#ac8d18\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<g clip-path=\"url(#clip5300)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:start;\" transform=\"rotate(0, 1951.8, 525.095)\" x=\"1951.8\" y=\"525.095\">log_2(alpha)</text>\n",
       "</g>\n",
       "</svg>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n",
       "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"600\" height=\"400\" viewBox=\"0 0 2400 1600\">\n",
       "<defs>\n",
       "  <clipPath id=\"clip5700\">\n",
       "    <rect x=\"0\" y=\"0\" width=\"2400\" height=\"1600\"/>\n",
       "  </clipPath>\n",
       "</defs>\n",
       "<path clip-path=\"url(#clip5700)\" d=\"\n",
       "M0 1600 L2400 1600 L2400 0 L0 0  Z\n",
       "  \" fill=\"#ffffff\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
       "<defs>\n",
       "  <clipPath id=\"clip5701\">\n",
       "    <rect x=\"480\" y=\"0\" width=\"1681\" height=\"1600\"/>\n",
       "  </clipPath>\n",
       "</defs>\n",
       "<path clip-path=\"url(#clip5700)\" d=\"\n",
       "M243.864 1425.62 L2352.76 1425.62 L2352.76 121.675 L243.864 121.675  Z\n",
       "  \" fill=\"#ffffff\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
       "<defs>\n",
       "  <clipPath id=\"clip5702\">\n",
       "    <rect x=\"243\" y=\"121\" width=\"2110\" height=\"1305\"/>\n",
       "  </clipPath>\n",
       "</defs>\n",
       "<polyline clip-path=\"url(#clip5702)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  524.608,1425.62 524.608,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5702)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  966.723,1425.62 966.723,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5702)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  1408.84,1425.62 1408.84,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5702)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  1850.95,1425.62 1850.95,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5702)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  2293.07,1425.62 2293.07,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5702)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  243.864,1367.51 2352.76,1367.51 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5702)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  243.864,1021.12 2352.76,1021.12 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5702)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  243.864,674.73 2352.76,674.73 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5702)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  243.864,328.342 2352.76,328.342 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5700)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,1425.62 2352.76,1425.62 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5700)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,1425.62 243.864,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5700)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  524.608,1425.62 524.608,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5700)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  966.723,1425.62 966.723,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5700)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  1408.84,1425.62 1408.84,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5700)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  1850.95,1425.62 1850.95,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5700)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  2293.07,1425.62 2293.07,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5700)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,1367.51 269.171,1367.51 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5700)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,1021.12 269.171,1021.12 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5700)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,674.73 269.171,674.73 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip5700)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,328.342 269.171,328.342 \n",
       "  \"/>\n",
       "<g clip-path=\"url(#clip5700)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 524.608, 1479.62)\" x=\"524.608\" y=\"1479.62\">2</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5700)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 966.723, 1479.62)\" x=\"966.723\" y=\"1479.62\">4</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5700)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 1408.84, 1479.62)\" x=\"1408.84\" y=\"1479.62\">6</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5700)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 1850.95, 1479.62)\" x=\"1850.95\" y=\"1479.62\">8</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5700)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 2293.07, 1479.62)\" x=\"2293.07\" y=\"1479.62\">10</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5700)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 219.864, 1385.01)\" x=\"219.864\" y=\"1385.01\">-4.0</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5700)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 219.864, 1038.62)\" x=\"219.864\" y=\"1038.62\">-3.5</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5700)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 219.864, 692.23)\" x=\"219.864\" y=\"692.23\">-3.0</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5700)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 219.864, 345.842)\" x=\"219.864\" y=\"345.842\">-2.5</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5700)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:84px; text-anchor:middle;\" transform=\"rotate(0, 1298.31, 73.2)\" x=\"1298.31\" y=\"73.2\">Log Maximum Constraint Violation</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5700)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:66px; text-anchor:middle;\" transform=\"rotate(0, 1298.31, 1559.48)\" x=\"1298.31\" y=\"1559.48\">Solver Iterations</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip5700)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:66px; text-anchor:middle;\" transform=\"rotate(-90, 89.2861, 773.647)\" x=\"89.2861\" y=\"773.647\">log|Constraint_violation|_inf</text>\n",
       "</g>\n",
       "<polyline clip-path=\"url(#clip5702)\" style=\"stroke:#009af9; stroke-width:4; stroke-opacity:1; fill:none\" stroke-dasharray=\"2, 4\" points=\"\n",
       "  303.55,158.579 524.608,328.921 745.665,523.485 966.723,1388.71 \n",
       "  \"/>\n",
       "<circle clip-path=\"url(#clip5702)\" cx=\"303.55\" cy=\"158.579\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip5702)\" cx=\"524.608\" cy=\"328.921\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip5702)\" cx=\"745.665\" cy=\"523.485\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip5702)\" cx=\"966.723\" cy=\"1388.71\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "</svg>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "visualize_optimality_merit(algames_solver)\n",
    "visualize_α(algames_solver)\n",
    "visualize_cmax(algames_solver)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n",
       "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"600\" height=\"400\" viewBox=\"0 0 2400 1600\">\n",
       "<defs>\n",
       "  <clipPath id=\"clip6100\">\n",
       "    <rect x=\"0\" y=\"0\" width=\"2400\" height=\"1600\"/>\n",
       "  </clipPath>\n",
       "</defs>\n",
       "<path clip-path=\"url(#clip6100)\" d=\"\n",
       "M0 1600 L2400 1600 L2400 0 L0 0  Z\n",
       "  \" fill=\"#ffffff\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
       "<defs>\n",
       "  <clipPath id=\"clip6101\">\n",
       "    <rect x=\"480\" y=\"0\" width=\"1681\" height=\"1600\"/>\n",
       "  </clipPath>\n",
       "</defs>\n",
       "<path clip-path=\"url(#clip6100)\" d=\"\n",
       "M203.721 1425.62 L2352.76 1425.62 L2352.76 121.675 L203.721 121.675  Z\n",
       "  \" fill=\"#ffffff\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
       "<defs>\n",
       "  <clipPath id=\"clip6102\">\n",
       "    <rect x=\"203\" y=\"121\" width=\"2150\" height=\"1305\"/>\n",
       "  </clipPath>\n",
       "</defs>\n",
       "<polyline clip-path=\"url(#clip6102)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  254.355,1425.62 254.355,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6102)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  763.749,1425.62 763.749,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6102)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  1273.14,1425.62 1273.14,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6102)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  1782.54,1425.62 1782.54,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6102)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  2291.93,1425.62 2291.93,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6102)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  203.721,1388.71 2352.76,1388.71 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6102)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  203.721,978.669 2352.76,978.669 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6102)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  203.721,568.624 2352.76,568.624 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6102)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  203.721,158.579 2352.76,158.579 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6100)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  203.721,1425.62 2352.76,1425.62 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6100)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  203.721,1425.62 203.721,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6100)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  254.355,1425.62 254.355,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6100)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  763.749,1425.62 763.749,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6100)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  1273.14,1425.62 1273.14,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6100)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  1782.54,1425.62 1782.54,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6100)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  2291.93,1425.62 2291.93,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6100)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  203.721,1388.71 229.509,1388.71 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6100)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  203.721,978.669 229.509,978.669 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6100)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  203.721,568.624 229.509,568.624 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6100)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  203.721,158.579 229.509,158.579 \n",
       "  \"/>\n",
       "<g clip-path=\"url(#clip6100)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 254.355, 1479.62)\" x=\"254.355\" y=\"1479.62\">0</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6100)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 763.749, 1479.62)\" x=\"763.749\" y=\"1479.62\">50</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6100)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 1273.14, 1479.62)\" x=\"1273.14\" y=\"1479.62\">100</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6100)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 1782.54, 1479.62)\" x=\"1782.54\" y=\"1479.62\">150</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6100)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 2291.93, 1479.62)\" x=\"2291.93\" y=\"1479.62\">200</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6100)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 179.721, 1406.21)\" x=\"179.721\" y=\"1406.21\">-3</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6100)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 179.721, 996.169)\" x=\"179.721\" y=\"996.169\">-2</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6100)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 179.721, 586.124)\" x=\"179.721\" y=\"586.124\">-1</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6100)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 179.721, 176.079)\" x=\"179.721\" y=\"176.079\">0</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6100)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:84px; text-anchor:middle;\" transform=\"rotate(0, 1278.24, 73.2)\" x=\"1278.24\" y=\"73.2\">Log_2 Newton Step Size</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6100)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:66px; text-anchor:middle;\" transform=\"rotate(0, 1278.24, 1559.48)\" x=\"1278.24\" y=\"1559.48\">Solver Iterations</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6100)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:66px; text-anchor:middle;\" transform=\"rotate(-90, 89.2861, 773.647)\" x=\"89.2861\" y=\"773.647\">log_2(alpha)</text>\n",
       "</g>\n",
       "<polyline clip-path=\"url(#clip6102)\" style=\"stroke:#009af9; stroke-width:4; stroke-opacity:1; fill:none\" stroke-dasharray=\"2, 4\" points=\"\n",
       "  264.542,1388.71 274.73,978.669 284.918,978.669 295.106,568.624 305.294,158.579 315.482,568.624 325.67,568.624 335.858,158.579 346.046,158.579 356.233,568.624 \n",
       "  366.421,568.624 376.609,568.624 386.797,568.624 396.985,568.624 407.173,568.624 417.361,158.579 \n",
       "  \"/>\n",
       "<circle clip-path=\"url(#clip6102)\" cx=\"264.542\" cy=\"1388.71\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6102)\" cx=\"274.73\" cy=\"978.669\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6102)\" cx=\"284.918\" cy=\"978.669\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6102)\" cx=\"295.106\" cy=\"568.624\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6102)\" cx=\"305.294\" cy=\"158.579\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6102)\" cx=\"315.482\" cy=\"568.624\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6102)\" cx=\"325.67\" cy=\"568.624\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6102)\" cx=\"335.858\" cy=\"158.579\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6102)\" cx=\"346.046\" cy=\"158.579\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6102)\" cx=\"356.233\" cy=\"568.624\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6102)\" cx=\"366.421\" cy=\"568.624\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6102)\" cx=\"376.609\" cy=\"568.624\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6102)\" cx=\"386.797\" cy=\"568.624\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6102)\" cx=\"396.985\" cy=\"568.624\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6102)\" cx=\"407.173\" cy=\"568.624\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6102)\" cx=\"417.361\" cy=\"158.579\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "</svg>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n",
       "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"600\" height=\"400\" viewBox=\"0 0 2400 1600\">\n",
       "<defs>\n",
       "  <clipPath id=\"clip6500\">\n",
       "    <rect x=\"0\" y=\"0\" width=\"2400\" height=\"1600\"/>\n",
       "  </clipPath>\n",
       "</defs>\n",
       "<path clip-path=\"url(#clip6500)\" d=\"\n",
       "M0 1600 L2400 1600 L2400 0 L0 0  Z\n",
       "  \" fill=\"#ffffff\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
       "<defs>\n",
       "  <clipPath id=\"clip6501\">\n",
       "    <rect x=\"480\" y=\"0\" width=\"1681\" height=\"1600\"/>\n",
       "  </clipPath>\n",
       "</defs>\n",
       "<path clip-path=\"url(#clip6500)\" d=\"\n",
       "M243.864 1425.62 L2352.76 1425.62 L2352.76 121.675 L243.864 121.675  Z\n",
       "  \" fill=\"#ffffff\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
       "<defs>\n",
       "  <clipPath id=\"clip6502\">\n",
       "    <rect x=\"243\" y=\"121\" width=\"2110\" height=\"1305\"/>\n",
       "  </clipPath>\n",
       "</defs>\n",
       "<polyline clip-path=\"url(#clip6502)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  293.552,1425.62 293.552,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6502)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  793.432,1425.62 793.432,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6502)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  1293.31,1425.62 1293.31,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6502)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  1793.19,1425.62 1793.19,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6502)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  2293.07,1425.62 2293.07,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6502)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  243.864,1175.56 2352.76,1175.56 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6502)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  243.864,923.553 2352.76,923.553 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6502)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  243.864,671.542 2352.76,671.542 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6502)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  243.864,419.531 2352.76,419.531 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6502)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n",
       "  243.864,167.52 2352.76,167.52 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,1425.62 2352.76,1425.62 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,1425.62 243.864,121.675 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  293.552,1425.62 293.552,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  793.432,1425.62 793.432,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  1293.31,1425.62 1293.31,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  1793.19,1425.62 1793.19,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  2293.07,1425.62 2293.07,1409.97 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,1175.56 269.171,1175.56 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,923.553 269.171,923.553 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,671.542 269.171,671.542 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,419.531 269.171,419.531 \n",
       "  \"/>\n",
       "<polyline clip-path=\"url(#clip6500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
       "  243.864,167.52 269.171,167.52 \n",
       "  \"/>\n",
       "<g clip-path=\"url(#clip6500)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 293.552, 1479.62)\" x=\"293.552\" y=\"1479.62\">0</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6500)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 793.432, 1479.62)\" x=\"793.432\" y=\"1479.62\">50</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6500)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 1293.31, 1479.62)\" x=\"1293.31\" y=\"1479.62\">100</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6500)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 1793.19, 1479.62)\" x=\"1793.19\" y=\"1479.62\">150</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6500)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 2293.07, 1479.62)\" x=\"2293.07\" y=\"1479.62\">200</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6500)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 219.864, 1193.06)\" x=\"219.864\" y=\"1193.06\">-3.0</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6500)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 219.864, 941.053)\" x=\"219.864\" y=\"941.053\">-2.5</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6500)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 219.864, 689.042)\" x=\"219.864\" y=\"689.042\">-2.0</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6500)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 219.864, 437.031)\" x=\"219.864\" y=\"437.031\">-1.5</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6500)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 219.864, 185.02)\" x=\"219.864\" y=\"185.02\">-1.0</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6500)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:84px; text-anchor:middle;\" transform=\"rotate(0, 1298.31, 73.2)\" x=\"1298.31\" y=\"73.2\">Log Maximum Constraint Violation</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6500)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:66px; text-anchor:middle;\" transform=\"rotate(0, 1298.31, 1559.48)\" x=\"1298.31\" y=\"1559.48\">Solver Iterations</text>\n",
       "</g>\n",
       "<g clip-path=\"url(#clip6500)\">\n",
       "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:66px; text-anchor:middle;\" transform=\"rotate(-90, 89.2861, 773.647)\" x=\"89.2861\" y=\"773.647\">log|Constraint_violation|_inf</text>\n",
       "</g>\n",
       "<polyline clip-path=\"url(#clip6502)\" style=\"stroke:#009af9; stroke-width:4; stroke-opacity:1; fill:none\" stroke-dasharray=\"2, 4\" points=\"\n",
       "  303.55,158.579 313.547,222.081 323.545,285.783 333.543,440.334 343.54,936.667 353.538,1067.43 363.535,1180.51 373.533,1274.28 383.531,1050.73 393.528,1169.5 \n",
       "  403.526,1271.37 413.523,1187.39 423.521,1159.32 433.518,1246.39 443.516,1359.87 453.514,1388.71 \n",
       "  \"/>\n",
       "<circle clip-path=\"url(#clip6502)\" cx=\"303.55\" cy=\"158.579\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6502)\" cx=\"313.547\" cy=\"222.081\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6502)\" cx=\"323.545\" cy=\"285.783\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6502)\" cx=\"333.543\" cy=\"440.334\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6502)\" cx=\"343.54\" cy=\"936.667\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6502)\" cx=\"353.538\" cy=\"1067.43\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6502)\" cx=\"363.535\" cy=\"1180.51\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6502)\" cx=\"373.533\" cy=\"1274.28\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6502)\" cx=\"383.531\" cy=\"1050.73\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6502)\" cx=\"393.528\" cy=\"1169.5\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6502)\" cx=\"403.526\" cy=\"1271.37\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6502)\" cx=\"413.523\" cy=\"1187.39\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6502)\" cx=\"423.521\" cy=\"1159.32\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6502)\" cx=\"433.518\" cy=\"1246.39\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6502)\" cx=\"443.516\" cy=\"1359.87\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "<circle clip-path=\"url(#clip6502)\" cx=\"453.514\" cy=\"1388.71\" r=\"14\" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"3.2\"/>\n",
       "</svg>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "visualize_α(ilqgames_solver)\n",
    "visualize_cmax(ilqgames_solver)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Julia 1.3.0",
   "language": "julia",
   "name": "julia-1.3"
  },
  "language_info": {
   "file_extension": ".jl",
   "mimetype": "application/julia",
   "name": "julia",
   "version": "1.3.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
